package Net;

/**
 * 类的定义
 * 语句：public class 类名{成员}
 *
 */
public class ClassDefine {
    int s=320;
    /**
     * 成员（fields）的定义
     * [public|private|protected] [static] [final] 类型  成员名
     *      public 公共成员——不同包也可访问；
     *      private 私有成员——只能在本类访问
     *      protected 保护成员——同包及子类可访问
     *     [ ]中什么都不写  默认——同包可访问
     * ******************************************************************
     *  static 静态成员——属于类的，它不属于具体的对象,该类的所有对象共享该成员。
     *          所以不是static的对象的对象都要实例化才能访问。
     *       static成员或方法直接通过类名访问（通过：类.  引用）
     * final成员 最终成员——其值不能被改变
     * final类  最终类——不能被继承
     * final方法   最终方法——该方法不被重写
     * 注：final和public可以加在类上面，而static不能。
     */

    public static void main(String[] args){
        StaticDemo sd1=new StaticDemo();
        StaticDemo sd2=new StaticDemo();
        sd1.a=10;sd2.a=20;
        sd1.b=100;sd2.b=200;
        //StaticDemo.b=100;StaticDemo.b=200; //与上一句等同
        System.out.println(sd1.a+"   "+sd1.b);
        System.out.println(sd2.a+"   "+sd1.b);
        System.out.println("--------------------------------------------");
        ClassDefine cd1=new ClassDefine();//实例化
        System.out.println(cd1.fac(5));//fac()前没加sataic时，要实例化才能调用fac()
        System.out.println("--------------------------------------------");
        ClassDefine cd2=new ClassDefine();//实例化
        cd2.s=20;
        System.out.println(cd2.fac(5));
        System.out.println("--------------------------------------------");
        //System.out.println(fac(6));//fac()前加sataic时，不需要实例化也能调用fac()
        //System.out.println(ClassDefine.fac(7));//与上一句相同
        System.out.println("--------------------------------------------");
    }

    /**
     * 方法定义：
     *  [public|private|protected] [static] [final] 类型  方法名（形参）{
     *     方法体
     *     return 表达式
     *  }
     *         类型（首字母大写）：指返回值的类型（既可以是基本类型，也可以是对象类型），
     *         方法名：做什么
     *         方法体：怎么做
     *         return除了能返回值，还可以结束此方法体
     * 规则：
     * 1.方法不能嵌套定义
     * 2.若局部变量和成员变量同名，则局部变量会屏蔽成员变量
     *      此时若要访问成员变量，用this.成员变量
     */
    //计算阶乘
    public int fac(int n){
        int s=1; //s为局部变量（在方法中定义的，当此方法被调用的时候创建s，当此方法执行完，s被释放）
        for (int i=1;i<=n;i++){
            s=s*i;
        }
        System.out.println("成员变量s："+this.s);//局部变量屏蔽成员变量 此时若要访问成员变量，用this.成员变量
        //this看对象是谁
        return s;//返回值
       // System.out.println("----");//return 后面不要再写语句了，因为不会执行，会成为死语句。
    }
}

class StaticDemo{
    int a;
    static int b;
}
